<?php

// +----------------------------------------------------------------------
// | 版权所有 2017-2027 云南环拓科技有限公司，并保留所有权利。
// +----------------------------------------------------------------------
// | Copyright (c) 2017-2027 http://www.yn123.com All rights reserved.
// +----------------------------------------------------------------------
// | Notice: This code is not open source, it is strictly prohibited
// |         to distribute the copy, otherwise it will pursue its
// |         legal responsibility.
// | 注意：  这不是一个自由软件！您只能在不用于商业目的的前提下对程序代码进行修改和使用,
// |        不允许对程序代码以任何形式任何目的的再发布。
// +----------------------------------------------------------------------
// | Author: feraner <feraner@163.com> 
// | Date: 2020/1/3
// +----------------------------------------------------------------------

namespace app\common\services\statistics;

use app\common\facade\Arr;
use Carbon\Carbon;
use think\Db;

/**
 *
 * Class BasicHandleService
 * @package app\common\services\statistics
 * @author feraner<feraner@163.com>
 * @date 2020/1/3
 */
abstract class BasicHandleService
{

    /**
     * 今天开始时间
     * @var int|null
     */
    protected $todayStart = null;


    /**
     * 今天结束时间
     * @var int|null
     */
    protected $todayEnd = null;

    /**
     * 当月开始时间
     * @var null
     */
    protected $monthStart = null;

    /**
     * 当月结束时间
     * @var null
     */
    protected $monthEnd = null;


    /**
     * 接口前缀
     * @var string
     */
    protected $apiSuffix = 'api';

    /**
     * web前缀
     * @var string
     */
    protected $webSuffix = 'index';

    /**
     * 是否是api 接口
     * @var bool
     */
    protected $isApi = false;

    /**
     * 是否是 web 界面
     * @var bool
     */
    protected $isWeb = false;

    /**
     * 是否加UV
     * @var bool
     */
    protected $addUv = true;




    public function __construct()
    {
        $this->todayStart = Carbon::today()->getTimestamp();
        $this->todayEnd = Carbon::today()->endOfDay()->getTimestamp();

        $this->monthStart = Carbon::today()->startOfMonth()->getTimestamp();
        $this->monthEnd = Carbon::today()->endOfMonth()->getTimestamp();
    }


    /**
     * 模块处理入口
     * @param $handleData
     *
     * @return mixed
     */
    abstract public function handle($handleData);


    /**
     * 处理月度 + 总量数据
     * @return mixed
     */
    abstract public function handleMonthAndTotal();


    /**
     * 确定是否需要处理
     * @return mixed
     */
    abstract protected function isHandle($handleData);




    /**
     * 是否增加UV
     * @param $userId
     * @param $logId
     *
     * @return bool
     */
    protected function addUvNum($userId, $logId)
    {
        $count = Db::name('user_behavior_log')
            ->where('user_id', $userId)
            ->where('id', '<=', $logId)
            ->where('created_at', '>=', $this->todayStart)
            ->where('created_at', '<=', $this->todayEnd)
            ->count();
        if ($count > 1) {
            return false;
        }
        return true;
    }


    /**
     * 检测模块统计是否已经存在
     * @param $data
     *
     * @return int
     */
    protected function checkModuleStatExit($data)
    {
        return Db::name('behavior_module_stat')
            ->where('type', Arr::get($data, 'type'))
            ->where('start_time', Arr::get($data, 'start_time'))
            ->where('end_time', Arr::get($data, 'end_time'))
            ->value('id') ?: 0;
    }


}
